package com.wang.test.demo.pdf;

import java.awt.Color;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Element;
import com.itextpdf.text.Font;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPRow;
import com.itextpdf.text.pdf.PdfPTable;


/**
 * 定义中文可以在pdf 内显示出来
 *
 * @author Administrator
 *
 */
public class PDFParagraph extends Paragraph {

    private static final long serialVersionUID = 1L;

    /**
     * 规范的黑色字体
     *
     * @param content
     */
    public PDFParagraph(String content) {
        super(content, getChineseFont());
    }

    /**
     * 自己定义 字体的规范
     *
     * @param content
     * @param fontSize 字体大小
     * @param style    Font.NORMAL 规范
     * @param color    BaseColor.RED
     */
    public PDFParagraph(String content, Integer fontSize, Integer style, BaseColor color) {
        super(content, getChineseFont(fontSize, style, color));
    }

    /**
     * 自己定义12px 的规范字体并且自己定义颜色
     *
     * @param content
     * @param color
     */
    public PDFParagraph(String content, BaseColor color) {
        super(content, getChineseFont(12, Font.NORMAL, color));
    }

    private static final Font getChineseFont() {

        Font FontChinese = null;
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            FontChinese = new Font(bfChinese, 12, Font.NORMAL);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
        return FontChinese;
    }

    private static final Font getChineseFont(Integer fontSize, Integer style, BaseColor color) {

        Font FontChinese = null;
        try {
            BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            FontChinese = new Font(bfChinese, fontSize, style, color);
        } catch (DocumentException de) {
            System.err.println(de.getMessage());
        } catch (IOException ioe) {
            System.err.println(ioe.getMessage());
        }
        return FontChinese;
    }
}

/**
 * 快速定义字体
 *
 * @author Administrator
 *
 */
class MyFont {
    /**
     * 默认的字体 size 12 常规字体，黑色
     *
     * @param content
     * @return
     */
    public static PDFParagraph speedFont(String content) {
        return new PDFParagraph(content);
    }

    /**
     * 自己定义一段文字
     *
     * @param content  文字内容
     * @param fontSize 文字大小
     * @param style    文字的央视 Font.NORMAL 常规
     * @param color    文字的颜色 BaseColor.RED
     * @return
     */
    public static PDFParagraph speedFont(String content, Integer fontSize, Integer style, BaseColor color) {
        return new PDFParagraph(content, fontSize, style, color);
    }

    /**
     * 设置一段常规 12 大小的字体，可以另外设置颜色
     *
     * @param content
     * @param color   BaseColor.RED
     * @return
     */
    public static PDFParagraph speedFont(String content, BaseColor color) {
        return new PDFParagraph(content, color);
    }

    /**
     * 自定义一个title 类似于标题
     *
     * @param content
     * @param fontSize
     * @param style
     * @param color
     * @param element  Element.ALIGN_CENTER 水平居中的意思
     * @return
     */
    public static PDFParagraph centerTitle(String content, Integer fontSize, Integer style, BaseColor color,
                                           Integer element) {
        PDFParagraph font = new PDFParagraph(content, fontSize, style, color);
        font.setAlignment(element);
        return font;
    }
}

/**
 * 快速定义一个table
 *
 * @author Administrator
 *
 */
class MyTable {
    /**
     * 解析list map 数据导出
     *
     * @param columnWidth 列宽度，可设置多个
     * @param list        要解析的数据
     * @return
     * @throws DocumentException
     */
    public static PdfPTable initTable(float[] columnWidth, List<Map<String, Object>> list) throws DocumentException {
        PdfPTable table = new PdfPTable(columnWidth.length);
        // 设置列宽
        table.setWidths(columnWidth);
        // 第一行是列名
        table.setHeaderRows(1);
        // 宽度填充
        table.getDefaultCell().setHorizontalAlignment(1);
        // 设置表哥的浮动宽度， 让文字保持居中
        //table.setWidthPercentage(100.0F);
        // 储存列标题
        Map<String, Integer> title = new HashMap<String, Integer>();
        // 当前创建的表哥的row 获取出来
        List<PdfPRow> rows = table.getRows();
        // 设置单元格背景颜色为灰色
        // cells0[0].setBackgroundColor(BaseColor.LIGHT_GRAY);
        for (int i = 0; i < list.size(); i++) {
            Map<String, Object> map = list.get(i);
            if (i == 0) {
                int j = 0;
                // 当前是第一列，解析出来所有的列
                PdfPCell[] cell = new PdfPCell[list.get(i).size()];
                for (String key : map.keySet()) {
                    // 把所有的列都存起来
                    title.put(key, j);
                    cell[j] = new PdfPCell(MyFont.centerTitle(key, 13, Font.BOLD, BaseColor.BLACK, Element.ALIGN_CENTER));
                    cell[j].setBackgroundColor(BaseColor.LIGHT_GRAY);
                    cell[j].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
                    cell[j].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
                    cell[j].setFixedHeight(25f);
                    j++;
                }
                rows.add(new PdfPRow(cell));
            }
            // 开始添加
            PdfPCell[] cell = new PdfPCell[list.get(i).size()];
            for (String key : map.keySet()) {
                cell[title.get(key)] = new PdfPCell(MyFont.speedFont(map.get(key) == null ? "" : map.get(key).toString()));
                cell[title.get(key)].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
                cell[title.get(key)].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
                cell[title.get(key)].setFixedHeight(25f);
            }
            rows.add(new PdfPRow(cell));
        }
        System.out.println("table 生成完成");
        return table;
    }

    public static PdfPTable initTable(String topTitle, float[] columnWidth, List<Map<String, Object>> list)
            throws DocumentException {
        // 新建一个表格 列数为列宽比例的个数
        PdfPTable table = new PdfPTable(columnWidth.length);
        // 宽度填充
        table.getDefaultCell().setHorizontalAlignment(1);
        // 设置表哥的浮动宽度， 让文字保持居中
        //table.setWidthPercentage(100.0F);
        // 获取到表格的行准备操作
        List<PdfPRow> rows = table.getRows();
        // 设置表格的列宽
        table.setWidths(columnWidth);
        // 定义一个列 然后跨列 添加到table 的表头
        PdfPCell[] celltop = new PdfPCell[2];
        celltop[0] = new PdfPCell(MyFont.centerTitle(topTitle, 13, Font.BOLD, BaseColor.BLACK, Element.ALIGN_CENTER));
        celltop[0].setBackgroundColor(BaseColor.LIGHT_GRAY);
        celltop[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
        celltop[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
        celltop[0].setFixedHeight(25f);
        // 设置跨列
        celltop[0].setColspan(2);
        rows.add(new PdfPRow(celltop));
        for(Map<String,Object> map : list) {
            for(String key : map.keySet()) {
                PdfPCell[] cells = new PdfPCell[2];
                cells[0] = new PdfPCell(MyFont.centerTitle(key, 13, Font.BOLD, BaseColor.BLACK, Element.ALIGN_CENTER));
                // 设置当前单元格的背景为灰色
                cells[0].setBackgroundColor(BaseColor.LIGHT_GRAY);
                cells[1] = new PdfPCell(MyFont.speedFont(map.get(key)==null?"":map.get(key).toString()));
                cells[0].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
                cells[0].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
                cells[0].setFixedHeight(25f);
                cells[1].setHorizontalAlignment(Element.ALIGN_CENTER);//水平居中
                cells[1].setVerticalAlignment(Element.ALIGN_MIDDLE);//垂直居中
                cells[1].setFixedHeight(25f);
                rows.add(new PdfPRow(cells));
            }
        }
        return table;
    }
}

